package com.lee.mq.common;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lishuo
 * Date: 2023-10-23
 * Time: 11:22
 */

import java.io.*;

/**
 * 封装对象的序列化和反序列化操作.
 */
public class BinaryTool {
    // 1.将对象序列化为二进制字节数组
    public static byte[] toBytes(Object object) throws IOException {
        // ByteArrayOutputStream 流对象相当于一个变长的字节数组,
        // 可以把 object 序列化的数据给逐渐的写入到 byteArrayOutputStream 中, 再统一转成 byte[].
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // writeObject 就会把该对象进行序列化, 生成的二进制字节数据, 就会写入到ObjectOutputStream 中,
                // 由于 ObjectOutputStream 又是关联到了 ByteArrayOutputStream, 最终结果就写入到 ByteArrayOutputStream
                objectOutputStream.writeObject(object);
            }
            return byteArrayOutputStream.toByteArray();
        }


    }
    // 2.将二进制字节数组反序列化为对象
    public static Object toObject(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // readObject, 就是从 data 这个 byte[] 中读取数据并进行反序列化.
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
